package main

import "fmt"

func main() {

	//1.函数的基本使用
	//r, _ := calc(13, 4, "+")
	//fmt.Println(r)
	//
	//j, _ := calc(13, 4, "-")
	//fmt.Println(j)
	//
	//x, _ := calc(13, 4, "*")
	//fmt.Println(x)
	//
	//w, _ := calc(13, 4, "/")
	//fmt.Println(w)

	//2.参数的引用传递和值传递
	//a := 1
	//b := 2
	//// 基本数据类型都是值传递   不会改变原值，只是把a，b对应的值拷贝一份传入
	//r := desc(a, b)
	//fmt.Println("a=", a, "b=", b)
	//fmt.Println("r=", r)
	//
	//// 若基本数据类型想改变值，传入了a,b的地址，会改变原值
	//t := desc2(&a, &b)
	//fmt.Println("a=", a, "b=", b)
	//fmt.Println("r=", t)

	//3.	 函数不支持重载

	//4.	函数的可变参数变成切片来处理
	//argsMany(1, 2, 3, 4, 5)

	//5.	函数也是一种数据类型  函数本身可以是一种参数类型
	manyArgs(100, "200", desc)

}

// (形参列表)(返回值类型列表)
// 首字母大写==public   首字母小写==private
func calc(a int, b int, calcType string) (int, int) {
	if calcType == "+" {
		return a + b, a
	} else if calcType == "-" {
		return a - b, a
	} else if calcType == "*" {
		return a * b, a
	} else if calcType == "/" {
		return a / b, a
	} else {
		return 0, a
	}
}

func desc(a int, b int) int {
	a--
	b--
	return a + b
}

func desc2(a *int, b *int) int {
	*a--
	*b--
	return *a + *b
}

func argsMany(args ...int) {
	for i, arg := range args {
		fmt.Println(i, arg)
	}
}

func test(a int, b int) int {
	return a + b
}

func manyArgs(k int, s string, myFunc func(int, int) int) {
	fmt.Println("manyArgs==>", k)
	fmt.Println("s==>", s)
	//传给你具体的函数名，你自己在内部传参 调用
	fmt.Println("myFunc result==>", myFunc(9, 9))
}
